package com.ruoyi.system.service.impl;

import com.alibaba.fastjson.JSON;
import com.ruoyi.common.annotation.DataScope;
import com.ruoyi.common.core.text.Convert;
import com.ruoyi.system.domain.BizDuty;
import com.ruoyi.system.domain.BizOndutyVO;
import com.ruoyi.system.domain.SysUser;
import com.ruoyi.system.mapper.BizDutyMapper;
import com.ruoyi.system.service.IBizDutyService;
import com.ruoyi.system.service.ISysUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.*;
import java.util.stream.Collectors;

/**
 * 排班Service业务层处理
 *
 * @author ruoyi
 * @date 2021-07-25
 */
@Service
public class BizDutyServiceImpl implements IBizDutyService {
    @Autowired
    private BizDutyMapper bizDutyMapper;

    @Autowired
    private ISysUserService userService;

    public static String DUTY_TEMPLATE = "{\"day1\":\"value\",\"day2\":\"value\",\"day3\":\"value\",\"day4\":\"value\",\"day5\":\"value\",\"day6\":\"value\",\"day7\":\"value\",\"day8\":\"value\",\"day9\":\"value\",\"day10\":\"value\",\"day11\":\"value\",\"day12\":\"value\",\"day13\":\"value\",\"day14\":\"value\",\"day15\":\"value\",\"day16\":\"value\",\"day17\":\"value\",\"day18\":\"value\",\"day19\":\"value\",\"day20\":\"value\",\"day21\":\"value\",\"day22\":\"value\",\"day23\":\"value\",\"day24\":\"value\",\"day25\":\"value\",\"day26\":\"value\",\"day27\":\"value\",\"day28\":\"value\",\"day29\":\"value\",\"day30\":\"value\",\"day31\":\"value\"}";

    /**
     * 查询排班
     *
     * @param id 排班ID
     * @return 排班
     */
    @Override
    public BizDuty selectBizDutyById(Long id) {
        return bizDutyMapper.selectBizDutyById(id);
    }

    /**
     * 查询排班列表
     *
     * @param bizDuty 排班
     * @return 排班
     */
    @Override
    @DataScope(deptAlias = "d", userAlias = "u")
    public List<BizDuty> selectBizDutyList(BizDuty bizDuty) {
        return bizDutyMapper.selectBizDutyList(bizDuty);
    }

    public List<BizDuty> selectBizDutyListAll(BizDuty bizDuty) {
        return bizDutyMapper.selectBizDutyList(bizDuty);
    }

    /**
     * 新增排班
     *
     * @param bizDuty 排班
     * @return 结果
     */
    @Override
    public int insertBizDuty(BizDuty bizDuty) {
        return bizDutyMapper.insertBizDuty(bizDuty);
    }

    /**
     * 修改排班
     *
     * @param bizDuty 排班
     * @return 结果
     */
    @Override
    public int updateBizDuty(BizDuty bizDuty) {
        return bizDutyMapper.updateBizDuty(bizDuty);
    }

    /**
     * 删除排班对象
     *
     * @param ids 需要删除的数据ID
     * @return 结果
     */
    @Override
    public int deleteBizDutyByIds(String ids) {
        return bizDutyMapper.deleteBizDutyByIds(Convert.toStrArray(ids));
    }

    /**
     * 删除排班信息
     *
     * @param id 排班ID
     * @return 结果
     */
    @Override
    public int deleteBizDutyById(Long id) {
        return bizDutyMapper.deleteBizDutyById(id);
    }

    public int updateBizDutyByIds(String idsStr, String dutyVal) {
        String[]             ids      = Convert.toStrArray(idsStr);
        String               dutyJson = DUTY_TEMPLATE.replaceAll("value", dutyVal);
        BizDuty              bizDuty  = JSON.parseObject(dutyJson, BizDuty.class);
        Map<String, Integer> map      = new HashMap<>(1);
        map.put("count", 0);
        Arrays.stream(ids).forEach(id -> {
            bizDuty.setId(Long.valueOf(id));
            int i = bizDutyMapper.updateBizDuty(bizDuty);
            map.put("count", map.get("count") + i);
        });
        return map.get("count");
    }


    @Override
    public List<BizOndutyVO> selectBizonDutyList(BizDuty bizDuty) {
        return bizDutyMapper.selectBizonDutyList(bizDuty);
    }

    @Override
    public int setMonthDutyBatch(String year, String month) {
        Map<String, Integer> rem = new HashMap<>(1);
        rem.put("count", 0);
        BizDuty bizDuty = new BizDuty();
        String year1 = year;
        Integer       last      = Integer.valueOf(month) -1;
        String        lastMonth = String.valueOf(last);
        lastMonth = lastMonth.length() < 2 ? "0" + lastMonth : lastMonth;
        if (last.intValue() == 0) {
            lastMonth = "12";
            year1 = String.valueOf(Integer.valueOf(year) - 1);
        }

        bizDuty.setYear(year1);
        bizDuty.setMonth(lastMonth);
        List<BizDuty> bizDuties = bizDutyMapper.selectBizDutyList(bizDuty); // 查询上个月的值班记录

        SysUser user = new SysUser();
        List<Long> ids = userService.selectUserIdList(user);
        bizDuty.setYear(year);
        bizDuty.setMonth(month);
        List<Long> hasIds = bizDutyMapper.selectAllUserIdHadSetDuty(bizDuty);
        bizDuties.forEach(d -> {

            String s = JSON.toJSONString(d);
            Map    m = JSON.parseObject(s, Map.class);

            List<String> list = new ArrayList<>();
            m.forEach((k, v) -> {
                if ((k + "").startsWith("day")) {
                    list.add(v + "");
                }
            });
            Map<String, Long> mm = list.stream().collect(Collectors.groupingBy(p -> p, Collectors.counting()));

            Map<String, Object> map = new HashMap<>(2);
            map.put("max", 0L);
            map.put("dutyValue", "办公");
            mm.forEach((k, v) -> {
                if (v > (Long) map.get("max")) {
                    map.put("dutyValue", k);
                    map.put("max", v);
                }
            });
            String dutyValue = (String) map.get("dutyValue");
            if (ids.contains(d.getUserId()) && !hasIds.contains(d.getUserId())) {
                String  dutyJson = DUTY_TEMPLATE.replaceAll("value", dutyValue);
                BizDuty duty     = JSON.parseObject(dutyJson, BizDuty.class);
                duty.setUserId(d.getUserId());
                duty.setYear(year);
                duty.setMonth(month);
                int i = bizDutyMapper.insertBizDuty(duty);
                rem.put("count", rem.get("count") + i);
                if (i > 0) {
                    ids.remove(d.getUserId());
                }
            }
        });

        ids.forEach(id -> {
            if (!hasIds.contains(id)) {
                String  dutyJson = DUTY_TEMPLATE.replaceAll("value", "办公");
                BizDuty duty     = JSON.parseObject(dutyJson, BizDuty.class);
                duty.setUserId(id);
                duty.setYear(year);
                duty.setMonth(month);
                int i = bizDutyMapper.insertBizDuty(duty);
                rem.put("count", rem.get("count") + i);
            }
        });

        // return rem.get("count");
        return 1;
    }

//    @Override
//    public int setMonthDutyBatch(String year, String month) {
//        Map<String, Integer> rem = new HashMap<>(1);
//        rem.put("count", 0);
//        BizDuty bizDuty = new BizDuty();
//        String year1 = year;
//        Integer       last      = Integer.valueOf(month) -1;
//        String        lastMonth = String.valueOf(last);
//        lastMonth = lastMonth.length() < 2 ? "0" + lastMonth : lastMonth;
//        if (last.intValue() == 0) {
//            lastMonth = "12";
//            year1 = String.valueOf(Integer.valueOf(year) - 1);
//        }
//
//        bizDuty.setYear(year1);
//        bizDuty.setMonth(lastMonth);
//        List<BizDuty> bizDuties = bizDutyMapper.selectBizDutyList(bizDuty); // 查询上个月的值班记录
//
//        SysUser user = new SysUser();
//        List<Long> ids = userService.selectUserIdList(user);
//        bizDuty.setYear(year);
//        bizDuty.setMonth(month);
//        List<Long> hasIds = bizDutyMapper.selectAllUserIdHadSetDuty(bizDuty);
//        bizDuties.forEach(d -> {
//
//            String s = JSON.toJSONString(d);
//            Map    m = JSON.parseObject(s, Map.class);
//
//            List<String> list = new ArrayList<>();
//            m.forEach((k, v) -> {
//                if ((k + "").startsWith("day")) {
//                    list.add(v + "");
//                }
//            });
//            Map<String, Long> mm = list.stream().collect(Collectors.groupingBy(p -> p, Collectors.counting()));
//
//            Map<String, Object> map = new HashMap<>(2);
//            map.put("max", 0L);
//            map.put("dutyValue", "01");
//            mm.forEach((k, v) -> {
//                if (v > (Long) map.get("max")) {
//                    map.put("dutyValue", k);
//                    map.put("max", v);
//                }
//            });
//            String dutyValue = (String) map.get("dutyValue");
//            if (ids.contains(d.getUserId()) && !hasIds.contains(d.getUserId())) {
//                String  dutyJson = DUTY_TEMPLATE.replaceAll("value", dutyValue);
//                BizDuty duty     = JSON.parseObject(dutyJson, BizDuty.class);
//                duty.setUserId(d.getUserId());
//                duty.setYear(year);
//                duty.setMonth(month);
//                int i = bizDutyMapper.insertBizDuty(duty);
//                rem.put("count", rem.get("count") + i);
//                if (i > 0) {
//                    ids.remove(d.getUserId());
//                }
//            }
//        });
//
//        ids.forEach(id -> {
//            if (!hasIds.contains(id)) {
//                String  dutyJson = DUTY_TEMPLATE.replaceAll("value", "01");
//                BizDuty duty     = JSON.parseObject(dutyJson, BizDuty.class);
//                duty.setUserId(id);
//                duty.setYear(year);
//                duty.setMonth(month);
//                int i = bizDutyMapper.insertBizDuty(duty);
//                rem.put("count", rem.get("count") + i);
//            }
//        });
//
//        // return rem.get("count");
//        return 1;
//    }

}
